package ffmpeg

import (
	"errors"
	"log"
	"os"
	"os/exec"
)

// MergeVideo 合成视频
func (f *SFFmpeg) MergeVideo(files []string) (outFile string, err error) {
	if len(files) == 0 {
		return "", errors.New(`视频地址不为空`)
	}
	// 取出第一个文件做原文件并处理输出文件
	if outFile, err = f.outFile(files[0], ``, `merged`); err != nil {
		return "", err
	}

	// 创建一个临时文件列表
	tempFile, err := os.CreateTemp("", "ffmpeg-concat-*.txt")
	if err != nil {
		return "", err
	}

	defer func(tempFile *os.File) {
		err = tempFile.Close()
		if err != nil {
			log.Printf(`关闭临时文件失败:%v`, err)
		}
		if removeErr := os.Remove(tempFile.Name()); removeErr != nil {
			log.Printf("删除临时文件失败: %v", removeErr)
		}
	}(tempFile) // 确保临时文件被删除

	// 写入文件列表到临时文件
	for _, file := range files {
		if _, err = tempFile.WriteString("file '" + file + "'\n"); err != nil {
			return "", err
		}
	}

	// 合成视频命令
	cmd := exec.Command(f.Driver, "-f", "concat", "-safe", "0", "-i", tempFile.Name(), "-c", "copy", outFile)

	// 执行命令
	if err = f.executeCommand(cmd); err != nil {
		return "", err
	}
	return outFile, nil
}
